package config

import (
	"bytes"
	"flag"
	"fmt"
	"strings"

	"github.com/spf13/viper"
)

var (
	fname string //配置文件名
)

func init() {
	flag.StringVar(&fname, "c", "conf/conf.toml", "default conf file path")
}

func LoadConfig(config interface{}, defaultData []byte, configFile, envPrefix string) {
	vcfg := viper.New()        //初始化
	vcfg.SetConfigType("toml") //配置文件类型
	_ = vcfg.ReadConfig(bytes.NewBuffer(defaultData))

	if configFile == "" {
		configFile = fname
	}
	vcfg.SetConfigFile(configFile)              // 指定配置文件路径
	if err := vcfg.ReadInConfig(); err != nil { // 查找并读取配置文件
		if _, ok := err.(viper.ConfigFileNotFoundError); ok {
			// 配置文件未找到错误
			panic(fmt.Errorf("conf file not found error: %s", err))
		} else {
			// 配置文件被找到，但产生了另外的错误
			panic(fmt.Errorf("other error : %s", err))
		}
	}

	if envPrefix != "" { //环境变量
		vcfg.SetEnvPrefix(envPrefix)
	}
	vcfg.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
	vcfg.AutomaticEnv()

	if err := vcfg.Unmarshal(config); err != nil {
		panic(fmt.Errorf("fatal error unmarshal config: %s", err))
	}
}
